﻿#pragma once
#include <stdio.h>
#include <stdlib.h>
#include <Windows.h>
#include <stdbool.h>
#include <locale.h>
#include <time.h>

#define WALL L'□'
#define BODY L'◎'
#define FOOD L'★'
#define POS_X 26
#define POS_Y 10

// 类型的声明

// 蛇的方向
enum DIRECTION
{
	UP=1,//上
	DOWN,//下
	LEFT,//左
	RIGHT//右
};

// 蛇的状态
enum GAMESTAUTS
{
	OK,
	KILL_BY_WALL,
	KILL_BY_SELF,
	END_NORMAL
};

// 创建蛇的身体节点
typedef struct SnackNode
{
	// 坐标
	int x;
	int y; 
	// 指向下一个蛇身的指针
	struct SnackNode* next;
}SnackNode, * pSnackNode;

// 面向对象：贪吃蛇
typedef struct Snack
{
	pSnackNode _pSnack;// 指向蛇头的指针
	pSnackNode _pFood; // 指向食物的指针
	enum DIRECTION _dir;// 蛇的方向
	enum GAMESTAUTS _stauts;// 蛇的状态
	int _socre;// 总分数
	int _foodweight;// 食物的权重
	int _SleepTime;// 休眠时间
}Snack, * pSnack;


// 函数的声明

// 游戏开始
void Game_Start(pSnack ps);

// 打印游戏的开始欢迎界面
void PrintWelcome();

//封装定位光标函数
void SetPos(short x, short y);

//创建地图
void CreateMap();

//创建蛇
void InitSnack(pSnack ps);

//创建食物
void CreateFood(pSnack ps);

// 游戏运行
void Game_Run(pSnack ps);

// 打印提示信息
void PrintInformation(pSnack ps);

// 暂停
void Pause();

//贪吃蛇走一步
void SnakeMove(pSnack ps);

// 判断下一个节点是否是食物
int NextIsFood(pSnackNode pNextNode, pSnack ps);

// 是食物吃掉
void EatFood(pSnackNode pNextNode, pSnack ps);

// 不是食物
void NoFood(pSnackNode pNextNode, pSnack ps);

// 检查蛇是否撞墙
void KillByWall(pSnack ps);

// 检查蛇是否撞到了自己
void KillBySelf(pSnack ps);

// 游戏结束
void Game_End(pSnack ps);